package com.guadoutech.lehuoer.utils;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.FaceDetector;
import android.util.Log;
public class CheckFaceUtils {

    public static Bitmap rotateBitmapIfNeeded(Bitmap bitmap) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        // 判断是否需要旋转
        if (width > height) {
            Matrix matrix = new Matrix();
            matrix.postRotate(270); // 旋转90度
            return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        } else {
            return bitmap;
        }
    }

    /**
     * 检查BitMap中包含的人脸数量
     */
    public static int checkFace(String imagePath) {

        Bitmap b = BitmapFactory.decodeFile(imagePath);
        if (b != null) {
            //处理横竖Bitmap的旋转
            b = rotateBitmapIfNeeded(b);

            // 检测前必须转化为RGB_565格式。文末有详述连接
            Bitmap bitmap = b.copy(Bitmap.Config.RGB_565, true);
            b.recycle();
            // 设置你想检测的数量，数值越大错误率越高，所以需要置信度来判断,但有时候置信度也会出问题
            int MAX_FACES = 5; // I found it can detect number of face at least 27,
            FaceDetector faceDet = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), MAX_FACES);
            // 将人脸数据存储到faceArray中
            FaceDetector.Face[] faceArray = new FaceDetector.Face[MAX_FACES];
            // 返回找到图片中人脸的数量，同时把返回的脸部位置信息放到faceArray中，过程耗时,图片越大耗时越久
            int findFaceNum = faceDet.findFaces(bitmap, faceArray);
            Log.w("FaceSDKUtils", "找到脸部数量:" + findFaceNum);
            bitmap.recycle();
            return findFaceNum;
        } else {
            Log.w("FaceSDKUtils", "目标文件不是图片，无法获取Bitmap");
            return -1;
        }

    }

    /**
     * 检查BitMap中的人脸质量
     */
    public static boolean checkFaceQuality(Bitmap bitmap) {
        //必须是565才能识别
        Bitmap bitmap1 = bitmap.copy(Bitmap.Config.RGB_565, true);
        FaceDetector faceDetector = new FaceDetector(bitmap1.getWidth(), bitmap1.getHeight(), 1);
        // 将人脸数据存储到faceArray中
        FaceDetector.Face[] faceArray = new FaceDetector.Face[1];
        int faces = faceDetector.findFaces(bitmap1, faceArray);
        Log.w("FaceSDKUtils", "图片分析->检测人脸数量：" + faces);
        if (faces > 0) {
            // 获取传回的第一张脸信息
            FaceDetector.Face face1 = faceArray[0];
            // 获取该部位为人脸的可信度，0~1 ; 0.3以上为可信
            if (face1 != null) {
                float confidence = face1.confidence();
                Log.w("FaceSDKUtils", "图片分析->检测人脸质量：" + confidence);
                if (confidence > 0.5f) {
                    Log.w("FaceSDKUtils", "图片分析->检测到脸啦！！");
                    return true;
                } else {
                    return false;
                }
            }
            return false;
        }

        return false;
    }


}
